ARD2  1.00 for Rev B. Hardware
Airbag Reference Demonstrator using MPC5604P
FLASH.h
Go to the documentation of this file.
00001 
00017 #ifndef _FLASH_H
00018 #define _FLASH_H
00019 
00020 /*
00021  **************************************************************
00022  * Defines, Macros and Typedefs 
00023  **************************************************************/
00024 /*** Constant Macros ***/
00025 /* Default Yes and No defines */
00026 #ifndef TRUE
00027  #define TRUE (1u)
00028 #endif
00029 #ifndef CLEAR
00030  #define CLEAR (0u)
00031 #endif
00032 #ifndef BITS_IN_NIBBLE
00033  #define BITS_IN_NIBBLE (4u)
00034 #endif
00035 #ifndef BITS_IN_BYTE
00036  #define BITS_IN_BYTE (8u)
00037 #endif
00038 #ifndef BYTES_IN_16
00039  #define BYTES_IN_16  (2u)
00040 #endif
00041 #ifndef BYTES_IN_32
00042  #define BYTES_IN_32  (4u)
00043 #endif
00044 #ifndef BITS_IN_32
00045  #define BITS_IN_32  (32u)
00046 #endif
00047 #ifndef BITS_IN_16
00048  #define BITS_IN_16  (16u)
00049 #endif
00050 #ifndef BIT_DEFINITION
00051  #define BIT_DEFINITION
00052  #define BIT0  (1u << 0u)
00053  #define BIT1  (1u << 1u)
00054  #define BIT2  (1u << 2u)
00055  #define BIT3  (1u << 3u)
00056  #define BIT4  (1u << 4u)
00057  #define BIT5  (1u << 5u)
00058  #define BIT6  (1u << 6u)
00059  #define BIT7  (1u << 7u)
00060  #define BIT8  (1u << 8u)
00061  #define BIT9  (1u << 9u)
00062  #define BIT10 (1u << 10)
00063  #define BIT11 (1u << 11)
00064  #define BIT12 (1u << 12)
00065  #define BIT13 (1u << 13)
00066  #define BIT14 (1u << 14)
00067  #define BIT15 (1u << 15) 
00068  #define BIT16 (1u << 16)
00069  #define BIT17 (1u << 17)
00070  #define BIT18 (1u << 18)
00071  #define BIT19 (1u << 19)
00072  #define BIT20 (1u << 20)
00073  #define BIT21 (1u << 21)
00074  #define BIT22 (1u << 22)
00075  #define BIT23 (1u << 23)
00076  #define BIT24 (1u << 24)
00077  #define BIT25 (1u << 25)
00078  #define BIT26 (1u << 26)
00079  #define BIT27 (1u << 27)
00080  #define BIT28 (1u << 28)
00081  #define BIT29 (1u << 29)
00082  #define BIT30 (1u << 30)
00083  #define BIT31 (1u << 31)
00084 #endif
00085 
00086 #define CODE_FLASH_ARRAY_0_MIN_ADDRESS            (0x00000000u)
00087 #define CODE_FLASH_ARRAY_0_TOP_ADDRESS            (0x0007FFFFu)
00088 #define CODE_FLASH_ARRAY_0_SHADOW_TOP_ADDRESS     (0x0027FFFFu)
00089 #define CODE_FLASH_ARRAY_0_SHADOW_MIN_ADDRESS     (0x00200000u)
00090 #define DATA_FLASH_ARRAY_0_MIN_ADDRESS            (0x00800000u)
00091 #define DATA_FLASH_ARRAY_0_TOP_ADDRESS            (0x0087FFFFu)
00092 
00093 /* Code Flash segments */
00094 #define CODE_FLASH_F0_SECTOR_MIN                  (0x00000000u)
00095 #define CODE_FLASH_F0_SECTOR_MAX                  (0x00007FFFu)
00096 #define CODE_FLASH_F1_SECTOR_MIN                  (0x00008000u)
00097 #define CODE_FLASH_F1_SECTOR_MAX                  (0x0000BFFFu)
00098 #define CODE_FLASH_F2_SECTOR_MIN                  (0x0000C000u)
00099 #define CODE_FLASH_F2_SECTOR_MAX                  (0x0000FFFFu)
00100 #define CODE_FLASH_F3_SECTOR_MIN                  (0x00010000u)
00101 #define CODE_FLASH_F3_SECTOR_MAX                  (0x00017FFFu)
00102 #define CODE_FLASH_F4_SECTOR_MIN                  (0x00018000u)
00103 #define CODE_FLASH_F4_SECTOR_MAX                  (0x0001FFFFu)
00104 #define CODE_FLASH_F5_SECTOR_MIN                  (0x00020000u)
00105 #define CODE_FLASH_F5_SECTOR_MAX                  (0x0003FFFFu)
00106 #define CODE_FLASH_F6_SECTOR_MIN                  (0x00040000u)
00107 #define CODE_FLASH_F6_SECTOR_MAX                  (0x0005FFFFu)
00108 #define CODE_FLASH_F7_SECTOR_MIN                  (0x00060000u)
00109 #define CODE_FLASH_F7_SECTOR_MAX                  (0x0007FFFFu)
00110 
00111 /* Data Flash segments */
00112 #define DATA_FLASH_F0_SECTOR_MIN                  (0x00800000u)
00113 #define DATA_FLASH_F0_SECTOR_MAX                  (0x00803FFFu)
00114 #define DATA_FLASH_F1_SECTOR_MIN                  (0x00804000u)
00115 #define DATA_FLASH_F1_SECTOR_MAX                  (0x00807FFFu)
00116 #define DATA_FLASH_F2_SECTOR_MIN                  (0x00808000u)
00117 #define DATA_FLASH_F2_SECTOR_MAX                  (0x0080BFFFu)
00118 #define DATA_FLASH_F3_SECTOR_MIN                  (0x0080C000u)
00119 #define DATA_FLASH_F3_SECTOR_MAX                  (0x0080FFFFu)
00120 #define DATA_FLASH_SECTOR_SIZE                    (0X00004000u)
00121 
00122 /* Lock keys */
00123 #define FLASH_PRIMARY_LOCK_KEY                    (0xA1A11111u)
00124 #define FLASH_SECONDARY_LOCK_KEY                  (0xC3C33333u)
00125 #define FLASH_ALLOW_COMPLETE_REFLASH              (0x00100000u)
00126 
00127 /* Time-outs */
00128 #define FLASHING_TIMEOUT         (0xF000u)
00129 #define ERASING_TIMEOUT          (0x1000000u)
00130 
00131 /* Status messages */
00132 #define STATUS_FLASHING_TIME_OUT (0x01u)
00133 #define STATUS_PROGRAMMED_WRONG  (0x02u)
00134 
00135 /* Routine sizes */
00136 #define FLASH_ROUTINE_SIZE       (0xDEu)
00137 #define ERASE_ROUTINE_SIZE       (0x7Cu)
00138 
00139 /* To use RAM, we need to define an address to which we'll copy our */
00140 /* function and from which we will execute                          */
00141 #define RAM_ADDRESS_FOR_FLASHING_ROUTINE         (0x40000000u)
00142 
00143 /*** Function Macros ***/
00144 #ifndef N_ELEMENTS
00145  #define N_ELEMENTS(X)           (sizeof(X)/sizeof(*(X)))
00146 #endif
00147 #define PROGRAM  ((uint8_t(*)(uint32_t* pu32Addrss, uint32_t* pu32Wrd, \
00148                   Flash_t ptInst, uint8_t u8TwoBytsAOnc))\
00149                   (RAM_ADDRESS_FOR_FLASHING_ROUTINE))
00150 #define ERASE    ((uint8_t(*)(Flash_t ptFlashInstance, uint32_t u32LMS))\
00151                   (RAM_ADDRESS_FOR_FLASHING_ROUTINE))
00152 
00153 
00154 /*** Enums ***/
00155 enum FLASH_TYPE
00156 {
00157   NOT_FLASHABLE = 0x7Fu, CODE_FLASH, CODE_FLASH_SHADOW, DATA_FLASH
00158 };
00159 enum FLASH_SECTOR
00160 {
00161   F0 = 0, F1, F2, F3, F4, F5, F6, F7
00162 };
00163 enum FLASH_OPERATION
00164 {
00165   DOUBLE_WORD_PROGRAM = 0x52u, SECTOR_ERASE, ARRAY_INTEGRITY_CHECK, 
00166   MARGIN_READ, ECC_LOGIC_CHECK
00167 };
00168 /*** TypeDefs ***/
00169 typedef volatile struct CFLASH_tag* Flash_t;
00170 /*
00171  **************************************************************
00172  * Declarations 
00173  **************************************************************/
00174 /*** Extern ***/
00175 
00176 /*** Globals ***/
00177 
00178 /*** Static Globals ***/
00179 
00180 /*
00181  **************************************************************
00182  * Function Prototypes 
00183  **************************************************************/
00184  /*
00185  ******************************************************************************
00186  *
00187  * Function:          u8fnFlashWriteDataFromRAM()
00188  *
00189  */
00203 static uint8_t u8fnFlashWriteDataFromRAM(uint32_t* pu32AddressToWrite, \
00204                                          uint32_t* pu32ValueToWrite,   \
00205                                          Flash_t  ptFlashInstance,     \
00206                                          uint8_t  u8TwoContiguousWords);
00207 /*
00208 ******************************************************************************
00209 *
00210 * Function:          u8fnFlashEraseFromRAM()
00211 *
00212 */
00223 static uint8_t u8fnFlashEraseFromRAM(Flash_t ptFlashInstance, uint32_t u32LMS);
00224 /*
00225 ******************************************************************************
00226 *
00227 * Function:          u8fnFlashWrite()
00228 *
00229 */
00241 uint8_t u8fnFlashWrite(uint32_t* pu32Source, uint32_t* pu32Destination, \
00242                        uint16_t u16Size);
00243 /*
00244 ******************************************************************************
00245 *
00246 * Function:          u8fnFlashErase()
00247 *
00248 */
00259 uint8_t u8fnFlashErase(uint32_t* pu32DataToErase);
00260 /*
00261 ******************************************************************************
00262 *
00263 * Function:          u8fnReturnTypeOfFlash()
00264 *
00265 */
00273 static uint8_t u8fnReturnTypeOfFlash(uint32_t u32Location);
00274 /*
00275 ******************************************************************************
00276 *
00277 * Function:          tfnFlashSelectInstance()
00278 *
00279 */
00287 static Flash_t tfnFlashSelectInstance(uint8_t u8Instance);
00288 /*
00289 ******************************************************************************
00290 *
00291 * Function:          tfnFlashSelectInstance()
00292 *
00293 */
00300 static uint8_t u8fnFlashReadBackInstance(Flash_t ptFlashInstance);
00301 /*
00302 ******************************************************************************
00303 *
00304 * Function:          u8fnReturnDataFlashSector()
00305 *
00306 */
00313 static uint8_t u8fnReturnDataFlashSector(uint32_t u32Address);
00314 /*
00315 ******************************************************************************
00316 *
00317 * Function:          u8fnReturnCodeFlashSector()
00318 *
00319 */
00326 static uint8_t u8fnReturnCodeFlashSector(uint32_t u32Address);
00327 /*
00328 ******************************************************************************
00329 *
00330 * Function:          u32fnFlashSectorToLMS()
00331 *
00332 */
00339 static uint32_t u32fnFlashSectorToLMS(uint8_t u8Sector);
00340 
00341 #endif /* _FILENAME_H */